package com.bjsxt;
/**Lambda表达式介绍*/
/*lambda 表达式是JDk8的一个新特性，可以取代大部分的匿名内部类、
（接口实现时用匿名内部类实现接口的抽象类），
写出更优雅的JAVA代码，尤其在集合的遍历和其他集合操作，可以极大地优化代码结构*/
//在Java中，可以为变量赋予一个值，JDk8以后可以利用Lambda特性，把一个代码块
//赋给一变量  例如:
    /*aBlockOfCode = public void doSomeShit(String s){
        System.out.println(s);
    }
    简化版：aBlockOfCode = （s）{System.out.println(s);}
    如果方法只有一行，可以不要大括号，在参数和函数之间加上一个箭头符号“ -> ”
     aBlockOfCode = （s）-> System.out.println(s);
     这样，就成功把“一块代码”赋给了一个变量，而“这块代码”，或者说"这个被赋给一变量的函数
     "，就是Lambda表达式。
     Lambda表达式本身就是一个接口的实现。 在aBlockOfCode加一个类型：(接口类型)
     interface MyLambdaInterface{ void doSomeShit(String s)}
     这种 只有一个 接口函数需要被实现的接口类型，叫：函数式接口。
     在接口的上面加一个声明@FunctionalInterface，这样别人就无法在里面添加新的接口函数。*/
   /* @FunctionalInterface
    interface MyLambdaInterface{ void doSomeShit(String s)}
    MyLambdaInterface aBlockOfCode = （s）-> System.out.println(s);*/
    /*注：
    * Lambda 规定接口中只能有一个需要被实现的方法，不是规定接口中只有一个方法
    * jdk8中有一个新特性：default，被default 修饰的方法全默认实现，不是必须被
    * 实现的方法，所以不影响lambda表达式的使用
    *@FunctionalInterface 标记的接口，“函数式接口” 是仅仅只包含一个抽象方法的接口 */
public class lambda00 {
    /**语法结构*/
    /*（parameters）-> expression  或 （parameters）-> {expression;}*/
    /*语法形式为（）-> {} 其中（）用来描述参数列表，{{用来描述方法体，-> 为 lambda
 运算符，读作（goes to）*/
    /*Lambda表达式的重要特征
    * 可选类型声明：不需要声明类型，编译器可以统一识别参数值
    * 可选的参数圆括号：一个参数无需要定义圆括号，但多个参数需要定义圆括号
    * 可选的大括号：如果主体包含了一个语句，就不需要使用大括号
    * 可选的返回关键字：如果主体只有一个表达式返回值，则编译器会自动返回值，大括号需
    * 要括定明表达式返回一个数值*/

    /*lambda 案例
    *1, 不需要参数，返回值为5      () ->5
    *2, 接收一个参数（数字类型），返回其2倍的值    x -> 2*x
    *3, 接收2个参数（数字），并返回他们的差值   （x，y）-> x-y
    *4, 接收2个int 型整数，返回他们的和  （int x,int y）-> x+y
    *5, 接收一个String 对象，并在控制台打印，不返回任何值（看起来像是返回void）
    *    (String  s) -> System.out.print(s)*/


}
